sources <- c("ESPN", "FantasyData", "FantasyPros", "FantasySharks", 
             "Yahoo", "FantasyFootballNerd", "NumberFire",
             "RTSports", "Walterfootball")

scrape <- scrape_data(src = sources,
                      pos = c('QB', 'RB', 'WR', 'TE', 'DST'),
                      season = 2020, 
                      week = week)

Simulation Time!

n_sims <- 10000

tic()
sim_lu <- map_df(1:n_sims, generate_lineup) %>%
  rename(pts_base = points) %>%  
  mutate(position = factor(position, 
                           levels = c("QB", "RB", "WR", "TE", "DST"))) %>% 
  select(lineup, Name, team, position, pts_base, pts_pred, sd_pts, Salary)
toc()
## 308.041 sec elapsed

Results

ggplotly(sim_lu %>% 
           group_by(Name, position, Salary) %>% 
           dplyr::summarize(lu = n_distinct(lineup)) %>% 
           ungroup() %>% 
           group_by(position) %>% 
           top_n(10, lu) %>% 
           ungroup() %>% 
           arrange(position, desc(lu)) %>% 
           mutate(Name = factor(Name),
                  Name = fct_reorder(Name, lu),
                  pct = round(lu / n_sims, 3) * 100) %>% 
           ggplot(aes(x = Name, y = pct, fill = Salary,
                      text = paste(Name, "in", lu, "lineups with", Salary, "salary"))) +
           geom_bar(stat = "identity") +
           facet_wrap(~position, ncol = 2, scales = "free_y") +
           coord_flip() +
           scale_fill_viridis_c() +
           xlab("") +
           ylab("Lineups (thousands)") +
           ggtitle("Top 10 Players By Position")) %>% 
  ggplotly(tooltip = "text")
plyr_lu <- sim_lu %>%
  group_by(Name, position) %>%
  dplyr::summarize(lu=n_distinct(lineup)) %>%
  ungroup() 

ggplotly(projections %>% 
  filter(avg_type=='weighted') %>%
  mutate(Name = ifelse(pos=="DST", last_name, paste(first_name, last_name))) %>%
  inner_join(fan_duel, by = c("Name", "position")) %>%
  select(Name, team, position, points, Salary, sd_pts) %>%
  left_join(plyr_lu, by='Name') %>%
  replace_na(list(lu=0)) %>%
  mutate(lu_bin=ifelse(lu==0, '0 Lineups', '>=1 Lineups'),
         lu_5=cut(lu,5, labels = FALSE)) %>%
  ggplot(aes(x=Salary, y=points, color=lu_bin, size=sd_pts, text=Name)) +
  geom_point() +
  theme_minimal() +
  scale_color_manual(values = c('red', 'blue'), name="") +
  geom_smooth(inherit.aes = FALSE, aes(x=Salary, y=points), method = 'lm') +
  ylab('Projected Points') +
  xlab('Salary') +
  ggtitle('Who makes it into Optimized Lineups?') +
  scale_x_continuous(labels=scales::dollar))
lu_df <- sim_lu %>%
  group_by(lineup) %>%
  dplyr::summarize(lineup_pts=sum(pts_pred),
                   lineup_sd=sum(sd_pts)) %>%
  ungroup()

pto <- psel(lu_df, low(lineup_sd) * high(lineup_pts))


ggplotly(ggplot(lu_df, aes(y=lineup_pts, x=lineup_sd, text = paste0("Lineup: ", lineup))) +
  geom_point() +
  geom_point(data=pto, size=5) +
  ylab('Lineup Points') +
  xlab('Lineup Points St Dev') +
  ggtitle('Lineup Points vs. Uncertainty',
          subtitle = 'Pareto Lineups Bolded'))
psel(lu_df, low(lineup_sd) * high(lineup_pts)) %>%
  left_join(sim_lu, by='lineup') %>%
  group_by(lineup) %>%
  arrange(lineup_pts, position, desc(Salary)) %>%
  select(lineup, lineup_pts, lineup_sd, Name, team, position, pts_pred, sd_pts, Salary) %>%
  mutate_at(vars(lineup_pts, lineup_sd, pts_pred, sd_pts), function(x) round(x, 2)) %>%
  knitr::kable() %>%
  kable_styling(fixed_thead = T) %>%
  column_spec(1:3, bold=TRUE) %>%
  collapse_rows(columns = 1:3, valign = 'top') %>%
  scroll_box(height = '700px', width = '100%')
lineup lineup_pts lineup_sd Name team position pts_pred sd_pts Salary
5798 130.02 3.50 Ryan Tannehill TEN QB 21.55 0.56 7500
Derrick Henry TEN RB 19.89 0.15 9500
Kareem Hunt CLE RB 19.10 0.23 8200
Jonathan Taylor IND RB 15.88 0.34 7300
Stefon Diggs BUF WR 14.49 0.29 7100
Tyler Boyd CIN WR 12.69 0.52 6400
Brandon Aiyuk SFO WR 11.74 0.03 5900
Hunter Henry LAC TE 10.01 0.68 5600
New York Jets NYJ DST 4.66 0.70 2500
1428 131.13 3.71 Russell Wilson SEA QB 23.76 0.70 8700
Kareem Hunt CLE RB 19.03 0.23 8200
Jonathan Taylor IND RB 16.18 0.34 7300
David Montgomery CHI RB 12.65 0.40 5800
Stefon Diggs BUF WR 13.97 0.29 7100
Justin Jefferson MIN WR 14.41 0.89 6600
Brandon Aiyuk SFO WR 11.84 0.03 5900
Travis Kelce KCC TE 14.32 0.13 7900
New York Jets NYJ DST 4.97 0.70 2500
6301 131.65 3.82 Russell Wilson SEA QB 24.60 0.70 8700
Derrick Henry TEN RB 19.95 0.15 9500
Kareem Hunt CLE RB 19.16 0.23 8200
Jonathan Taylor IND RB 15.77 0.34 7300
Tyler Boyd CIN WR 13.34 0.52 6400
Marquise Brown BAL WR 11.12 0.47 5900
Brandon Aiyuk SFO WR 11.81 0.03 5900
Hunter Henry LAC TE 10.91 0.68 5600
New York Jets NYJ DST 5.01 0.70 2500
8894 133.59 4.28 Russell Wilson SEA QB 25.16 0.70 8700
Kareem Hunt CLE RB 18.98 0.23 8200
Jonathan Taylor IND RB 15.83 0.34 7300
David Montgomery CHI RB 13.09 0.40 5800
Tyler Lockett SEA WR 15.19 1.25 7200
Tyler Boyd CIN WR 13.69 0.52 6400
Brandon Aiyuk SFO WR 11.78 0.03 5900
Darren Waller LVR TE 13.50 0.78 6800
Seattle Seahawks SEA DST 6.37 0.03 3700
4044 134.41 4.44 Russell Wilson SEA QB 23.98 0.70 8700
Kareem Hunt CLE RB 18.82 0.23 8200
Jonathan Taylor IND RB 16.22 0.34 7300
David Montgomery CHI RB 12.45 0.40 5800
Tyler Lockett SEA WR 17.84 1.25 7200
Stefon Diggs BUF WR 13.83 0.29 7100
Tyler Boyd CIN WR 13.95 0.52 6400
Hunter Henry LAC TE 10.89 0.68 5600
Seattle Seahawks SEA DST 6.42 0.03 3700
9745 134.87 4.77 Russell Wilson SEA QB 25.30 0.70 8700
Alvin Kamara NOS RB 20.06 0.89 9000
Kareem Hunt CLE RB 18.89 0.23 8200
Jonathan Taylor IND RB 16.00 0.34 7300
Tyler Boyd CIN WR 14.32 0.52 6400
Brandon Aiyuk SFO WR 11.76 0.03 5900
Cole Beasley BUF WR 10.07 0.93 5300
Hunter Henry LAC TE 11.50 0.68 5600
New Orleans Saints NOS DST 6.98 0.44 3600
1844 134.95 4.92 Russell Wilson SEA QB 24.66 0.70 8700
Kareem Hunt CLE RB 19.16 0.23 8200
Jonathan Taylor IND RB 16.08 0.34 7300
David Montgomery CHI RB 12.49 0.40 5800
Tyler Lockett SEA WR 16.55 1.25 7200
Tyler Boyd CIN WR 13.53 0.52 6400
Brandon Aiyuk SFO WR 11.77 0.03 5900
George Kittle SFO TE 15.02 0.75 7700
New York Jets NYJ DST 5.69 0.70 2500
6599 135.08 4.95 Russell Wilson SEA QB 25.50 0.70 8700
Derrick Henry TEN RB 20.07 0.15 9500
Kareem Hunt CLE RB 19.31 0.23 8200
Jonathan Taylor IND RB 15.74 0.34 7300
Tyler Boyd CIN WR 13.52 0.52 6400
Brandon Aiyuk SFO WR 11.76 0.03 5900
Cole Beasley BUF WR 11.91 0.93 5300
Trey Burton IND TE 10.94 1.25 5300
Detroit Lions DET DST 6.33 0.80 3400
7981 135.19 5.06 Patrick Mahomes KCC QB 28.54 1.50 9200
Kareem Hunt CLE RB 18.82 0.23 8200
Jonathan Taylor IND RB 15.74 0.34 7300
David Montgomery CHI RB 12.26 0.40 5800
Tyler Lockett SEA WR 16.83 1.25 7200
Marquise Brown BAL WR 12.07 0.47 5900
Brandon Aiyuk SFO WR 11.78 0.03 5900
Travis Kelce KCC TE 14.15 0.13 7900
New York Jets NYJ DST 5.01 0.70 2500
6385 135.20 5.10 Russell Wilson SEA QB 24.73 0.70 8700
Kareem Hunt CLE RB 19.11 0.23 8200
David Montgomery CHI RB 12.77 0.40 5800
Myles Gaskin MIA RB 13.74 0.99 5700
Davante Adams GBP WR 18.38 0.78 9100
Tyler Boyd CIN WR 13.72 0.52 6400
Brandon Aiyuk SFO WR 11.81 0.03 5900
George Kittle SFO TE 14.81 0.75 7700
New York Jets NYJ DST 6.12 0.70 2500
4002 135.65 5.28 Russell Wilson SEA QB 24.40 0.70 8700
Alvin Kamara NOS RB 20.77 0.89 9000
Kareem Hunt CLE RB 19.06 0.23 8200
Myles Gaskin MIA RB 14.18 0.99 5700
Tyler Boyd CIN WR 13.51 0.52 6400
Marquise Brown BAL WR 11.09 0.47 5900
Brandon Aiyuk SFO WR 11.77 0.03 5900
George Kittle SFO TE 15.93 0.75 7700
New York Jets NYJ DST 4.94 0.70 2500
2731 135.74 Russell Wilson SEA QB 25.64 0.70 8700
Kareem Hunt CLE RB 18.98 0.23 8200
Jonathan Taylor IND RB 15.81 0.34 7300
Giovani Bernard CIN RB 13.19 1.38 5900
Tyler Lockett SEA WR 17.75 1.25 7200
Tyler Boyd CIN WR 13.13 0.52 6400
Brandon Aiyuk SFO WR 11.71 0.03 5900
Travis Kelce KCC TE 14.37 0.13 7900
New York Jets NYJ DST 5.17 0.70 2500
8302 135.96 5.29 Russell Wilson SEA QB 24.73 0.70 8700
Kareem Hunt CLE RB 19.22 0.23 8200
Jonathan Taylor IND RB 16.06 0.34 7300
Myles Gaskin MIA RB 13.96 0.99 5700
Tyler Lockett SEA WR 15.65 1.25 7200
Tyler Boyd CIN WR 13.78 0.52 6400
Brandon Aiyuk SFO WR 11.73 0.03 5900
Darren Waller LVR TE 13.96 0.78 6800
New Orleans Saints NOS DST 6.86 0.44 3600
5966 136.18 5.58 Russell Wilson SEA QB 24.43 0.70 8700
Derrick Henry TEN RB 20.19 0.15 9500
Kareem Hunt CLE RB 18.79 0.23 8200
Jonathan Taylor IND RB 16.16 0.34 7300
Tyler Lockett SEA WR 16.92 1.25 7200
Brandon Aiyuk SFO WR 11.80 0.03 5900
Cole Beasley BUF WR 11.39 0.93 5300
Trey Burton IND TE 10.75 1.25 5300
New York Jets NYJ DST 5.73 0.70 2500
8785 136.42 5.62 Russell Wilson SEA QB 25.10 0.70 8700
Derrick Henry TEN RB 19.95 0.15 9500
Kareem Hunt CLE RB 19.22 0.23 8200
Myles Gaskin MIA RB 13.48 0.99 5700
Tyler Lockett SEA WR 16.45 1.25 7200
Justin Jefferson MIN WR 13.31 0.89 6600
Brandon Aiyuk SFO WR 11.79 0.03 5900
Hunter Henry LAC TE 10.84 0.68 5600
New York Jets NYJ DST 6.28 0.70 2500
4404 136.87 5.68 Russell Wilson SEA QB 24.26 0.70 8700
Kareem Hunt CLE RB 18.87 0.23 8200
Jonathan Taylor IND RB 15.70 0.34 7300
David Montgomery CHI RB 13.07 0.40 5800
Davante Adams GBP WR 18.93 0.78 9100
Tyler Lockett SEA WR 16.65 1.25 7200
Brandon Aiyuk SFO WR 11.76 0.03 5900
Trey Burton IND TE 12.40 1.25 5300
New York Jets NYJ DST 5.22 0.70 2500
1328 138.89 6.02 Patrick Mahomes KCC QB 27.10 1.50 9200
Derrick Henry TEN RB 20.02 0.15 9500
Kareem Hunt CLE RB 19.03 0.23 8200
David Montgomery CHI RB 12.60 0.40 5800
Tyler Lockett SEA WR 16.03 1.25 7200
Tyler Boyd CIN WR 14.02 0.52 6400
Brandon Aiyuk SFO WR 11.78 0.03 5900
Trey Burton IND TE 12.70 1.25 5300
New York Jets NYJ DST 5.61 0.70 2500
3093 139.12 6.70 Patrick Mahomes KCC QB 28.89 1.50 9200
Kareem Hunt CLE RB 19.29 0.23 8200
Jonathan Taylor IND RB 16.08 0.34 7300
Myles Gaskin MIA RB 13.02 0.99 5700
Tyler Lockett SEA WR 18.07 1.25 7200
DeVante Parker MIA WR 11.89 1.09 6100
Marquise Brown BAL WR 11.88 0.47 5900
Travis Kelce KCC TE 14.17 0.13 7900
New York Jets NYJ DST 5.82 0.70 2500
133 139.64 7.22 Ryan Tannehill TEN QB 20.70 0.56 7500
Derrick Henry TEN RB 20.01 0.15 9500
Kareem Hunt CLE RB 19.19 0.23 8200
David Montgomery CHI RB 12.74 0.40 5800
Tyler Lockett SEA WR 15.64 1.25 7200
Justin Jefferson MIN WR 14.56 0.89 6600
Nelson Agholor LVR WR 16.14 2.29 5000
George Kittle SFO TE 15.31 0.75 7700
New York Jets NYJ DST 5.35 0.70 2500
5385 140.25 8.22 Russell Wilson SEA QB 25.05 0.70 8700
Kareem Hunt CLE RB 19.33 0.23 8200
Jonathan Taylor IND RB 15.64 0.34 7300
David Montgomery CHI RB 12.51 0.40 5800
Tyler Lockett SEA WR 14.78 1.25 7200
Jamison Crowder NYJ WR 21.22 3.29 6300
Tee Higgins CIN WR 12.72 1.20 6000
Darren Waller LVR TE 12.66 0.78 6800
Seattle Seahawks SEA DST 6.34 0.03 3700
9200 140.35 8.80 Patrick Mahomes KCC QB 25.13 1.50 9200
Alvin Kamara NOS RB 20.39 0.89 9000
Kareem Hunt CLE RB 19.31 0.23 8200
Myles Gaskin MIA RB 13.46 0.99 5700
Tyler Lockett SEA WR 18.61 1.25 7200
Tyler Boyd CIN WR 12.69 0.52 6400
Nelson Agholor LVR WR 13.19 2.29 5000
Hunter Henry LAC TE 10.19 0.68 5600
New Orleans Saints NOS DST 7.39 0.44 3600
6293 146.16 9.01 Ryan Tannehill TEN QB 21.19 0.56 7500
Kareem Hunt CLE RB 19.03 0.23 8200
Chris Carson SEA RB 31.36 5.62 7600
Jonathan Taylor IND RB 15.64 0.34 7300
Justin Jefferson MIN WR 14.78 0.89 6600
Tyler Boyd CIN WR 13.44 0.52 6400
Brandon Aiyuk SFO WR 11.82 0.03 5900
Darren Waller LVR TE 12.56 0.78 6800
Seattle Seahawks SEA DST 6.35 0.03 3700
2929 146.90 12.19 Brett Rypien DEN QB 34.97 8.89 6100
Derrick Henry TEN RB 20.12 0.15 9500
Kareem Hunt CLE RB 19.02 0.23 8200
Jonathan Taylor IND RB 16.18 0.34 7300
Tyler Boyd CIN WR 13.21 0.52 6400
Tee Higgins CIN WR 12.65 1.20 6000
Brandon Aiyuk SFO WR 11.76 0.03 5900
Travis Kelce KCC TE 14.36 0.13 7900
New York Jets NYJ DST 4.62 0.70 2500
9569 148.96 13.22 Brett Rypien DEN QB 38.63 8.89 6100
Derrick Henry TEN RB 19.69 0.15 9500
Alvin Kamara NOS RB 18.23 0.89 9000
Kareem Hunt CLE RB 18.90 0.23 8200
Tyler Boyd CIN WR 12.90 0.52 6400
Brandon Aiyuk SFO WR 11.73 0.03 5900
Cole Beasley BUF WR 10.87 0.93 5300
Hunter Henry LAC TE 10.50 0.68 5600
Denver Broncos DEN DST 7.51 0.90 3900
6872 151.50 14.19 Brett Rypien DEN QB 38.74 8.89 6100
Alvin Kamara NOS RB 20.47 0.89 9000
Kareem Hunt CLE RB 19.18 0.23 8200
David Montgomery CHI RB 12.52 0.40 5800
Davante Adams GBP WR 18.26 0.78 9100
Tyler Boyd CIN WR 13.54 0.52 6400
T.Y. Hilton IND WR 11.38 0.93 5500
Hunter Henry LAC TE 9.80 0.68 5600
Los Angeles Chargers LAC DST 7.61 0.87 4300
273 154.13 14.77 Brett Rypien DEN QB 42.15 8.89 6100
Derrick Henry TEN RB 20.02 0.15 9500
Kareem Hunt CLE RB 19.36 0.23 8200
Jonathan Taylor IND RB 15.55 0.34 7300
Tyler Lockett SEA WR 14.71 1.25 7200
Tyler Boyd CIN WR 13.11 0.52 6400
James Washington PIT WR 10.05 1.94 5000
George Kittle SFO TE 14.27 0.75 7700
New York Jets NYJ DST 4.91 0.70 2500
9269 154.67 16.83 Brett Rypien DEN QB 36.65 8.89 6100
Derrick Henry TEN RB 19.99 0.15 9500
Kareem Hunt CLE RB 19.12 0.23 8200
Jonathan Taylor IND RB 15.84 0.34 7300
Tyler Lockett SEA WR 15.27 1.25 7200
Jamison Crowder NYJ WR 18.09 3.29 6300
Tee Higgins CIN WR 12.60 1.20 6000
Darren Waller LVR TE 12.89 0.78 6800
New York Jets NYJ DST 4.22 0.70 2500